home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / AmiVoGL_MDEV.lha / drivers / X11.c < prev   
C/C++ Source or Header  |  1994-04-12  |  22KB  |  1,161 lines

  1. /*
  2.  * VOGL/VOGLE driver for X11.
  3.  * 
  4.  * Define VOGLE if this driver is really for the VOGLE Libarary.
  5.  *
  6.  */
  7. #define VOGLE 1
  8.  
  9. #include <stdio.h>
  10. #include <X11/Xlib.h>
  11. #include <X11/Xutil.h>
  12.  
  13. #ifdef VOGLE
  14.  
  15. #include "vogle.h"
  16. static    char    *me = "vogle";
  17. #define LARGEFONT       "-adobe-courier-medium-r-normal--24-240-75-75-m-150-iso8859-1"
  18. #define SMALLFONT       "-adobe-courier-medium-r-normal--10-100-75-75-m-60-iso8859-1"
  19.  
  20. #else
  21.  
  22. #include "vogl.h"
  23. static    char    *me = "vogl";
  24. #define LARGEFONT    "9x15bold"
  25. #define SMALLFONT    "6x13bold"
  26.  
  27. #endif
  28.  
  29. #define MIN(x,y)    ((x) < (y) ? (x) : (y))
  30. #define MAX(x,y)    ((x) > (y) ? (x) : (y))
  31. #define    CMAPSIZE    256
  32. #define    EV_MASK        KeyPressMask|ButtonReleaseMask|ExposureMask|ButtonPressMask
  33.  
  34. static    int        maxw = -1, maxh = -1;
  35. static    Window        winder;
  36. static    Display        *display;
  37. static    int        screen;
  38. static    unsigned long    carray[CMAPSIZE];
  39. static    Colormap    colormap;
  40.  
  41. static    Drawable    theDrawable = -1;
  42. static    GC        theGC;
  43. static    XGCValues    theGCvalues;
  44. static    Pixmap        bbuf;        /* Back buffer pixmap */
  45. static    int        back_used = 0;    /* Have we backbuffered ? */
  46.  
  47. static    XFontStruct    *font_id = (XFontStruct *)NULL;
  48. XEvent            event;
  49.  
  50. static    unsigned long    colour;
  51. static    unsigned int    h, w;
  52. static    char        *smallf, *largef;
  53. static    char        use_toolkit_win = 0;
  54.  
  55. /*
  56.  * vo_xt_set_win
  57.  *
  58.  *    Just sets the drawable to the partucular window.
  59.  */
  60. int vo_xt_set_win(
  61.   Display *dis,
  62.   Drawable win,
  63.   int xw,
  64.   int xh)
  65. {
  66.     int    backb;
  67.  
  68.     backb = (theDrawable == bbuf);
  69.  
  70.     winder = win;
  71.  
  72.     vdevice.sizeX = vdevice.sizeY = MIN(xh, xw);
  73.     vdevice.sizeSx = xw;
  74.     vdevice.sizeSy = xh;
  75.  
  76.         if (xw > maxw || xh > maxh) {
  77.         if (back_used) {
  78.             back_used = 0;
  79.             XFreePixmap(display, bbuf);
  80.             X11_backbuf();
  81.         }
  82.         }
  83.  
  84.     display = dis;
  85.     if (backb)
  86.         theDrawable = bbuf;
  87.     else
  88.         theDrawable = win;
  89.  
  90.     return(1);
  91. }
  92.  
  93. /*
  94.  * vo_xt_window
  95.  *
  96.  *    Tells VOGL/VOGLE to use a window from an X11 toolkit (eg xview)
  97.  *    and not to make it's own window.
  98.  */
  99. int vo_xt_window(
  100.   Display *dis,
  101.   Window win,
  102.   int xw,
  103.   int xh)
  104. {
  105.     int    backb, i, depth;
  106.  
  107.     backb = (theDrawable == bbuf);
  108.  
  109.     display = dis;
  110.     winder = win;
  111.     screen = DefaultScreen(display);
  112.     colormap = DefaultColormap(display, screen);
  113.     depth = vdevice.depth = DefaultDepth(display, screen);
  114.     theDrawable = winder;
  115.  
  116.     use_toolkit_win = 1;
  117.     w = xw;
  118.     h = xh;
  119.  
  120.     /*
  121.      * Set our standard colors...
  122.      */
  123.     if (vdevice.depth == 1) {
  124.         /*
  125.          * Black and white - anything that's not black is white.
  126.          */
  127.         carray[0] = BlackPixel(display, screen);
  128.         for (i = 1; i < CMAPSIZE; i++)
  129.             carray[i] = WhitePixel(display, screen);
  130.     } else {
  131.         /*
  132.          * Color, try to get our colors close to what's in the
  133.          * default colormap.
  134.          */
  135.         X11_mapcolor(0, 0, 0, 0);
  136.         X11_mapcolor(1, 255, 0, 0);
  137.         X11_mapcolor(2, 0, 255, 0);
  138.         X11_mapcolor(3, 255, 255, 0);
  139.         X11_mapcolor(4, 0, 0, 255);
  140.         X11_mapcolor(5, 255, 0, 255);
  141.         X11_mapcolor(6, 0, 255, 255);
  142.         X11_mapcolor(7, 255, 255, 255);
  143.     }
  144.  
  145.     if ((smallf = XGetDefault(display, me, "smallfont")) == (char *)NULL)
  146.         smallf = SMALLFONT;
  147.  
  148.     if ((largef = XGetDefault(display, me, "largefont")) == (char *)NULL)
  149.         largef = LARGEFONT;
  150.  
  151.     /*
  152.      * Create Graphics Context and Drawable
  153.      */
  154.     theGC = XDefaultGC(display, screen);
  155.     theGCvalues.graphics_exposures = False;
  156.     theGCvalues.cap_style = CapButt;
  157.     XChangeGC(display, theGC, GCGraphicsExposures|GCCapStyle, &theGCvalues);
  158.     X11_color(0);
  159.  
  160.     vdevice.sizeX = vdevice.sizeY = MIN(xh, xw);
  161.     vdevice.sizeSx = xw;
  162.     vdevice.sizeSy = xh;
  163.  
  164.         if (back_used && (xw > maxw || xh > maxh)) {
  165.                 back_used = 0;
  166.         XFreePixmap(display, bbuf);
  167.                 X11_backbuf();
  168.         }
  169.  
  170.     if (backb)
  171.         theDrawable = bbuf;
  172.     else
  173.         theDrawable = win;
  174.  
  175.  
  176. #ifndef VOGLE
  177.     vdevice.devname = "X11";
  178. #endif
  179.  
  180.     return(1);
  181. }
  182.  
  183. /*
  184.  *    vo_xt_win_size
  185.  *
  186.  * If the X toolkit has changed the window size, then
  187.  * you might wish to call this routine to tell vogl/vogle about it.
  188.  */
  189. int vo_xt_win_size(
  190.   int xw,
  191.   int xh)
  192. {
  193.     char    backb;
  194.  
  195.     w = xw;
  196.     h = xh;
  197.  
  198.     vdevice.sizeX = vdevice.sizeY = MIN(h, w);
  199.     vdevice.sizeSx = w;
  200.     vdevice.sizeSy = h;
  201.  
  202.     backb = (theDrawable == bbuf);
  203.  
  204.     if (back_used) {
  205.  
  206.         /* Have to re allocate the back buffer */
  207.  
  208.         XFreePixmap(display, bbuf);
  209.  
  210.         bbuf = XCreatePixmap(display,
  211.             (Drawable)winder,
  212.             (unsigned int)vdevice.sizeSx + 1,
  213.             (unsigned int)vdevice.sizeSy + 1,
  214.             (unsigned int)vdevice.depth
  215.         );
  216.     }
  217.     if (backb)
  218.         theDrawable = (Drawable)bbuf;
  219. }
  220.  
  221. /*
  222.  * return the X display in use.
  223.  */
  224. Display * vo_xt_get_display(void)
  225. {
  226.     return(display);
  227. }
  228.  
  229. /*
  230.  * return the X Window in use.
  231.  */
  232. Window * vo_xt_get_window(void)
  233. {
  234.     return(winder);
  235. }
  236.  
  237.  
  238. /*
  239.  * X11_init
  240.  *
  241.  *    initialises X11 display.
  242.  */
  243. int X11_init(void)
  244. {
  245.     int        i;
  246.     int        x, y, prefx, prefy, prefxs, prefys;
  247.     unsigned int    bw, depth, mask;
  248.     Window        rootw, childw;
  249.     char        *av[2], name[128], *geom;
  250.  
  251.     XSetWindowAttributes    theWindowAttributes;
  252.     XWindowAttributes    retWindowAttributes;
  253.         XSizeHints              theSizeHints;
  254.         unsigned long           theWindowMask;
  255.     XWMHints                theWMHints;
  256.  
  257.  
  258.     if (use_toolkit_win)
  259.         return(1);
  260.  
  261.     av[0] = me;
  262.     av[1] = (char *)NULL;
  263.  
  264.     if ((display = XOpenDisplay((char *)NULL)) == (Display *)NULL) {
  265.         fprintf(stderr,"%s: X11_init: can't connect to X server\n", me);
  266.         exit(1);
  267.     }
  268.  
  269.     screen = DefaultScreen(display);
  270.     winder = RootWindow(display, screen);
  271.     colormap = DefaultColormap(display, screen);
  272.     depth = vdevice.depth = DefaultDepth(display, screen);
  273.  
  274.     /*
  275.      * Set our standard colors...
  276.      */
  277.     if (vdevice.depth == 1) {
  278.         /*
  279.          * Black and white - anything that's not black is white.
  280.          */
  281.         carray[0] = BlackPixel(display, screen);
  282.         for (i = 1; i < CMAPSIZE; i++)
  283.             carray[i] = WhitePixel(display, screen);
  284.     } else {
  285.         /*
  286.          * Color, try to get our colors close to what's in the
  287.          * default colormap.
  288.          */
  289.         X11_mapcolor(0, 0, 0, 0);
  290.         X11_mapcolor(1, 255, 0, 0);
  291.         X11_mapcolor(2, 0, 255, 0);
  292.         X11_mapcolor(3, 255, 255, 0);
  293.         X11_mapcolor(4, 0, 0, 255);
  294.         X11_mapcolor(5, 255, 0, 255);
  295.         X11_mapcolor(6, 0, 255, 255);
  296.         X11_mapcolor(7, 255, 255, 255);
  297.     }
  298.  
  299.     getprefposandsize(&prefx, &prefy, &prefxs, &prefys);
  300.  
  301.     /*
  302.      * NEED TO USE XGRABPOINTER here???
  303.      */
  304.     XQueryPointer(display, winder, &rootw, &childw, &x, &y, &x, &y, &mask);
  305.  
  306.     if (childw == None)
  307.         childw = rootw;
  308.  
  309. /*
  310.     if (!XGetWindowAttributes(display, childw, &retWindowAttributes)) {
  311.         fprintf(stderr,"Can't get window attributes.");
  312.         exit(1);
  313.     }
  314.  
  315.     x = retWindowAttributes.x;
  316.     y = retWindowAttributes.y;
  317.     w = retWindowAttributes.width;
  318.     h = retWindowAttributes.height;
  319.     bw = retWindowAttributes.border_width;
  320.     depth = vdevice.depth = retWindowAttributes.depth;
  321.  
  322.     XTranslateCoordinates(display,
  323.             childw, retWindowAttributes.root,
  324.             0, 0,
  325.             &x, &y,
  326.             &rootw
  327.     );
  328. */
  329.  
  330.     XGetGeometry(display, childw, &rootw, &x, &y, &w, &h, &bw, &depth);
  331.  
  332.         theWindowAttributes.backing_store = WhenMapped;
  333.         theWindowAttributes.save_under = True;
  334.         theWindowAttributes.border_pixel = carray[1];
  335.  
  336.  
  337.     /*
  338.      * See if there is something in the .Xdefaults file regarding
  339.      * VOGL/VOGLE.
  340.      */
  341.  
  342.     if ((smallf = XGetDefault(display, me, "smallfont")) == (char *)NULL)
  343.         smallf = SMALLFONT;
  344.  
  345.     if ((largef = XGetDefault(display, me, "largefont")) == (char *)NULL)
  346.         largef = LARGEFONT;
  347.  
  348.     geom = XGetDefault(display, me, "Geometry");
  349.  
  350.     if (geom != (char *)NULL) {
  351.         mask = XParseGeometry(geom, &x, &y, &w, &h);
  352.  
  353.         if (mask & XValue)
  354.             theSizeHints.flags |= USPosition;
  355.  
  356.         if (mask & YValue)
  357.             theSizeHints.flags |= USPosition;
  358.  
  359.         if (mask & WidthValue)
  360.             theSizeHints.flags |= USSize;
  361.  
  362.         if (mask & HeightValue)
  363.             theSizeHints.flags |= USSize;
  364.  
  365.         if (mask & XNegative)
  366.              x = DisplayWidth(display, screen) - 2*bw - w + x;
  367.  
  368.         if (mask & YNegative)
  369.             y = DisplayHeight(display, screen) - 2*bw - h + y;
  370.  
  371.     } else
  372.         theSizeHints.flags = PPosition | PSize;
  373.  
  374.     if (prefx > -1) {
  375.             x = prefx;
  376.             y = prefy;
  377.     }
  378.  
  379.     if (prefxs > -1) {
  380.             w = prefxs;
  381.             h = prefys;
  382.     }
  383.  
  384.     if (bw == 0)
  385.         bw = 4;
  386.  
  387.     x -= bw;
  388.     y -= bw;
  389.  
  390.     if (x <= 0)
  391.         x = 0;
  392.  
  393.     if (y <= 0)
  394.         y = 0;
  395.  
  396.     w -= 4 * bw;
  397.     h -= 4 * bw;
  398.  
  399.         theWindowMask = CWBorderPixel|CWBackingStore;
  400.  
  401.         winder = XCreateWindow(display,
  402.                                 winder,
  403.                                 x, y,
  404.